#!/bin/bash
# 文件名：auto_ssh_trust.sh
# 描述：全自动SSH双向信任建立工具（支持从文件读取IP和密码）
# 版本：4.0（支持IP:密码文件格式）

# ====== 配置区 ======
USER="root"                  # 目标机用户名
TARGET_FILE="./target_ips.txt"  # 目标服务器IP和密码文件
LOG_FILE="/var/log/ssh_trust.log"  # 审计日志路径
RETRY_TIMES=3                # 失败重试次数
KEY_TYPE="ed25519"           # 密钥算法类型
PORT=22                      # 目标服务器端口号
# ====================

# 输入验证：检查目标文件
validate_input() {
    # 检查目标文件是否存在
    if [ ! -f "$TARGET_FILE" ]; then
        echo "[ERROR] 目标文件不存在: $TARGET_FILE" | tee -a $LOG_FILE
        exit 1
    fi

    # 读取文件并过滤有效IP和密码（支持#注释和空行）
    mapfile -t TARGET_ENTRIES < <(grep -vE '^#|^$' "$TARGET_FILE")

    # 检查是否读取到有效条目
    if [ ${#TARGET_ENTRIES[@]} -eq 0 ]; then
        echo "[ERROR] 目标文件中未找到有效IP和密码" | tee -a $LOG_FILE
        exit 1
    fi

    echo "[$(date +%F%T)] 已加载目标IP和密码列表：" | tee -a $LOG_FILE
    # printf '%s\n' "${TARGET_ENTRIES[@]}" | tee -a $LOG_FILE
}

# 生成跳板机密钥
generate_key() {
    echo "[$(date +%F%T)] 正在生成跳板机密钥..." | tee -a $LOG_FILE
    if [ ! -f ~/.ssh/id_${KEY_TYPE} ]; then
        ssh-keygen -t ${KEY_TYPE} -N "" -f ~/.ssh/id_${KEY_TYPE} -q
        [ $? -eq 0 ] && echo "密钥生成成功" || exit 1
    fi
}

# 批量部署公钥到目标节点
deploy_key() {
    local ip=$1
    local password=$2
    echo "[$(date +%F%T)] 正在处理节点 $ip" | tee -a $LOG_FILE
    
    for ((i=1; i<=$RETRY_TIMES; i++)); do
        sshpass -p "$password" ssh-copy-id \
            -o StrictHostKeyChecking=no \
            -o ConnectTimeout=10 \
            -i ~/.ssh/id_ed25519.pub \
            -p $PORT \
            $USER@$ip >/dev/null 2>&1

        if [ $? -eq 0 ]; then
            echo "节点 $ip 公钥部署成功" | tee -a $LOG_FILE
            return 0
        else
            echo "节点 $ip 第$i次尝试失败，等待重试..." | tee -a $LOG_FILE
            sleep $((i*2))
        fi
    done
    echo "[ERROR] 节点 $ip 公钥部署失败！" | tee -a $LOG_FILE
    return 1
}



# 主执行流程
main() {
    echo "===== 开始执行 SSH 信任批量部署 =====" | tee -a $LOG_FILE
    validate_input    # 输入验证
    generate_key      # 生成密钥

    for entry in "${TARGET_ENTRIES[@]}"; do
        ip=$(echo "$entry" | cut -d':' -f1 | xargs)
        password=$(echo "$entry" | cut -d':' -f2 | xargs)

        # 检查IP和密码是否有效
        if [[ -z "$ip" || -z "$password" ]]; then
            echo "[ERROR] 无效的IP或密码: $entry" | tee -a $LOG_FILE
            continue
        fi
        echo "[$(date +%F%T)] 正在处理节点 $ip" 
        deploy_key "$ip" "$password"  # 部署公钥
    done

    echo "===== 部署完成 =====" | tee -a $LOG_FILE
    
    # 生成校验报告
    echo -e "\n[校验报告]"
    for entry in "${TARGET_ENTRIES[@]}"; do
        ip=$(echo "$entry" | cut -d':' -f1)
        ssh -o PasswordAuthentication=no $USER@$ip "echo '[SUCCESS] $ip 连接成功'"
    done | tee -a $LOG_FILE
}


main